package com.cool.generator;

import com.cool.JapFasterApplication;
import com.cool.helper.ClazzHelper;
import com.cool.util.FileUtil;
import com.cool.util.StrUtil;
import org.joda.time.DateTime;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.Environment;
import org.springframework.test.context.junit4.SpringRunner;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.File;
import java.io.FileWriter;
import java.net.URL;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Set;

/**
 * Title: jpa 一键生成所有的代码 （controller+service+dao）
 * Description: 一键生成所有的代码
 * @author yls
 * @created 2018/11/30 16:38
 */

@RunWith(SpringRunner.class)
@SpringBootTest(classes={JapFasterApplication.class})// 指定启动类
public class JpaFasterGenerator {

    /**
     * 环境配置
     */
    @Autowired
    private Environment env;

    /**
     * 模板引擎
     */
    @Autowired
    private TemplateEngine templateEngine;



    /**
     * 生成的主入口
     */
    @Test
    public void generator(){
        //1、基础包名，读取目录不用修改
        String basePackage="com.cool";
        //通过反射读取指定目录的所有的实体类
        String modelPackage=basePackage+".model";
        //获取所有的model实体类
        Set<Class<?>> classSet = ClazzHelper.getClasses(modelPackage);

        //1、生成所有的controller类
        generateController(classSet);
        //2、生成所有的service类
        generateService(classSet);
        //3、生成所有的serviceImpl类
        generateServiceImpl(classSet);
        //4、生成所有的dao类
        generateDao(classSet);
    }


    /**
     * 生成所有的controller
     * @param classSet
     */
    private void generateController(Set<Class<?>> classSet){
        for (Class<?> calzz : classSet) {
            String entityName=calzz.getSimpleName();
            String entityInstancePrifex= StrUtil.toLowerCaseFirstOne(entityName);
            //文件名称
            String fileName=entityName+"Controller";
            String serviceFileName=entityName+"Service";
            //读取作者信息
            String author= env.getProperty("code.generator.author");

            //设置上下文需要替换的值
            Context context = new Context();
            //设置作者
            context.setVariable("author", author);
            //文件名称
            context.setVariable("fileName", fileName);
            context.setVariable("serviceFileName", serviceFileName);
            //设置引用的包信息
            context.setVariable("modelPackage",env.getProperty("com.cool.jpafaster.modelPackage"));
            context.setVariable("controllerPackage",env.getProperty("com.cool.jpafaster.controllerPackage"));
            context.setVariable("servicePackage",env.getProperty("com.cool.jpafaster.servicePackage"));
            //类的名称
            context.setVariable("entityName", entityName);
            //类的实例对象
            context.setVariable("entityInstancePrifex", entityInstancePrifex);
            //创建时间
            context.setVariable("createDate",  new DateTime().toString("yyyy年MM月dd日 HH:mm:ss EE", Locale.CHINESE));

            //获取替换后的文本信息
            String text = templateEngine.process("controller", context);
            //工程路径
            String projectPath=System.getProperty("user.dir");
            //controller所在的路径
            String controllerPath=projectPath+ File.separator+"/src/main/java/com/cool/controller";
            try {
                //生成javaa文件
                File javaFile=FileUtil.generateJavaFile(new File(controllerPath),fileName);
                FileUtil.write(javaFile,text);
            } catch (Exception e) {
                e.printStackTrace();
            }

            System.out.println(text);
        }
    }


    /**
     * 生成所有的service
     * @param classSet
     */
    private void generateService(Set<Class<?>> classSet){
        for (Class<?> calzz : classSet) {
            String entityName=calzz.getSimpleName();
            String entityInstancePrifex= StrUtil.toLowerCaseFirstOne(entityName);
            //文件名称
            String fileName=entityName+"Service";
            //读取作者信息
            String author= env.getProperty("code.generator.author");

            //设置上下文需要替换的值
            Context context = new Context();
            //设置作者
            context.setVariable("author", author);
            //文件名称
            context.setVariable("fileName", fileName);
            //设置引用的包信息
            context.setVariable("modelPackage",env.getProperty("com.cool.jpafaster.modelPackage"));
            context.setVariable("servicePackage",env.getProperty("com.cool.jpafaster.servicePackage"));
            //类的名称
            context.setVariable("entityName", entityName);

            //类的实例对象
            context.setVariable("entityInstancePrifex", entityInstancePrifex);
            //创建时间
            context.setVariable("createDate",  new DateTime().toString("yyyy年MM月dd日 HH:mm:ss EE", Locale.CHINESE));
            //获取替换后的文本信息
            String text = templateEngine.process("service", context);

            //工程路径
            String projectPath=System.getProperty("user.dir");
            //controller所在的路径
            String controllerPath=projectPath+ File.separator+"/src/main/java/com/cool/service";
            try {
                //生成javaa文件
                File javaFile=FileUtil.generateJavaFile(new File(controllerPath),fileName);
                FileUtil.write(javaFile,text);
            } catch (Exception e) {
                e.printStackTrace();
            }

            System.out.println(text);
        }
    }



    /**
     * 生成所有的serviceImpl
     */
    public void generateServiceImpl(Set<Class<?>> classSet){
        for (Class<?> calzz : classSet) {
            String entityName=calzz.getSimpleName();
            String entityInstancePrifex= StrUtil.toLowerCaseFirstOne(entityName);

            String servcieFileName=entityName+"Service";
            //文件名称
            String fileName=entityName+"ServiceImpl";

            //读取作者信息
            String author= env.getProperty("code.generator.author");

            //设置上下文需要替换的值
            Context context = new Context();
            //设置作者
            context.setVariable("author", author);
            //文件名称
            context.setVariable("fileName", fileName);
            //文件名称
            context.setVariable("servcieFileName", servcieFileName);
            //设置引用的包信息
            context.setVariable("modelPackage",env.getProperty("com.cool.jpafaster.modelPackage"));
            context.setVariable("servicePackage",env.getProperty("com.cool.jpafaster.serviceImplPackage"));
            context.setVariable("daoPackage",env.getProperty("com.cool.jpafaster.daoPackage"));
            //类的名称
            context.setVariable("entityName", entityName);
            //类的实例对象
            context.setVariable("entityInstancePrifex", entityInstancePrifex);
            //创建时间
            context.setVariable("createDate",  new DateTime().toString("yyyy年MM月dd日 HH:mm:ss EE", Locale.CHINESE));
            //获取替换后的文本信息
            String text = templateEngine.process("serviceImpl", context);

            //工程路径
            String projectPath=System.getProperty("user.dir");
            //controller所在的路径
            String controllerPath=projectPath+ File.separator+"/src/main/java/com/cool/service/impl";
            try {
                //生成javaa文件
                File javaFile=FileUtil.generateJavaFile(new File(controllerPath),fileName);
                FileUtil.write(javaFile,text);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * 生成所有的dao层
     */
    public void generateDao(Set<Class<?>> classSet){
        for (Class<?> calzz : classSet) {
            String entityName=calzz.getSimpleName();
            String entityInstancePrifex= StrUtil.toLowerCaseFirstOne(entityName);
            //文件名称
            String fileName=entityName+"Repository";

            //读取作者信息
            String author= env.getProperty("code.generator.author");

            //设置上下文需要替换的值
            Context context = new Context();
            //设置作者
            context.setVariable("author", author);
            //文件名称
            context.setVariable("fileName", fileName);
            //设置引用的包信息
            context.setVariable("modelPackage",env.getProperty("com.cool.jpafaster.modelPackage"));
            context.setVariable("daoPackage",env.getProperty("com.cool.jpafaster.daoPackage"));
            //类的名称
            context.setVariable("entityName", entityName);
            //类的实例对象
            context.setVariable("entityInstancePrifex", entityInstancePrifex);
            //创建时间
            context.setVariable("createDate",  new DateTime().toString("yyyy年MM月dd日 HH:mm:ss EE", Locale.CHINESE));
            //获取替换后的文本信息
            String text = templateEngine.process("repository", context);

            //工程路径
            String projectPath=System.getProperty("user.dir");
            //controller所在的路径
            String controllerPath=projectPath+ File.separator+"/src/main/java/com/cool/repository";
            try {
                //生成javaa文件
                File javaFile=FileUtil.generateJavaFile(new File(controllerPath),fileName);
                FileUtil.write(javaFile,text);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}
